<?php
namespace app\api\controller;

use think\facade\Request;
use think\facade\Db;
use app\api\model\Chat as ChatModel;
use app\admin\controller\Admin;

class Chat
{
    public function messageDel()
    {
        $client_uuid = Request::post('client_uuid');
        if (empty($client_uuid)) {
            return json(['code' => 400,'msg' => 'id不能为空']);
        }
        $res = Db::name('chat_online_users')->where('client_uuid', $client_uuid)->delete();
        if ($res) {
            return json(['code' => 200,'msg' => '删除成功']);
        } else {
            return json(['code' => 400,'msg' => '删除失败']);
        }
    }
    /**
     * 发送消息（客户或客服）
     */
    public function sendMessage()
    {
        $data = Request::post();
        
        // 验证必填字段
        // 先处理client_uuid，确保是字符串类型
        $clientUuid = $data['client_uuid'] ?? '';
        if (is_array($clientUuid)) {
            $clientUuid = !empty($clientUuid) ? (string)reset($clientUuid) : '';
        } else {
            $clientUuid = (string)$clientUuid;
        }
        
        if (empty($clientUuid)) {
            return json(['code' => 400, 'msg' => 'client_uuid不能为空']);
        }
        
        // 判断消息类型
        $messageType = isset($data['message_type']) ? (int)$data['message_type'] : 1; // 1-文本，2-图片
        
        // 验证消息内容并处理
        $messageText = '';
        $imageUrl = '';
        
        if ($messageType == 1) {
            // 文本消息，必须有message内容
            $messageValue = $data['message'] ?? '';
            // 如果是数组，转换为字符串（取第一个元素）
            if (is_array($messageValue)) {
                $messageText = !empty($messageValue) ? (string)reset($messageValue) : '';
            } else {
                $messageText = (string)$messageValue;
            }
            // 去除首尾空格
            $messageText = trim($messageText);
            if (empty($messageText)) {
                return json(['code' => 400, 'msg' => '消息内容不能为空']);
            }
        } else if ($messageType == 2) {
            // 图片消息，必须有image_url
            $imageUrlValue = $data['image_url'] ?? '';
            // 如果是数组，转换为字符串（取第一个元素）
            if (is_array($imageUrlValue)) {
                $imageUrl = !empty($imageUrlValue) ? (string)reset($imageUrlValue) : '';
            } else {
                $imageUrl = (string)$imageUrlValue;
            }
            // 去除首尾空格
            $imageUrl = trim($imageUrl);
            if (empty($imageUrl)) {
                return json(['code' => 400, 'msg' => '图片URL不能为空']);
            }
            // 图片消息的message可以为空或包含图片描述（可能包含换行符，所以不能trim）
            $messageValue = $data['message'] ?? '[图片]';
            if (is_array($messageValue)) {
                $messageText = !empty($messageValue) ? (string)reset($messageValue) : '[图片]';
            } else {
                $messageText = (string)$messageValue;
            }
            // 对于图片消息，保留换行符，只去除首尾空白字符（空格、制表符等），但保留换行符
            // 如果消息为空或只有空白字符，才使用默认值
            // 只去除首尾的空格和制表符，保留换行符
            $messageText = rtrim(ltrim($messageText, " \t"), " \t");
            if (empty($messageText)) {
                $messageText = '[图片]';
            }
        }
        
        // 判断发送者类型
        $senderTypeValue = $data['sender_type'] ?? 1;
        // 如果是数组，取第一个元素
        if (is_array($senderTypeValue)) {
            $senderType = !empty($senderTypeValue) ? (int)reset($senderTypeValue) : 1;
        } else {
            $senderType = (int)$senderTypeValue;
        }
        
        // 如果是客服发送，需要验证token并获取admin_id
        $adminId = 0;
        if ($senderType == 2) {
            $admin = new Admin();
            $tokenResult = $admin->decodeToken();
            $tokenData = json_decode($tokenResult, true);
            
            if (!isset($tokenData['data']['adminId'])) {
                return json(['code' => 401, 'msg' => '未登录或登录已过期']);
            }
            
            $adminId = $tokenData['data']['adminId'];
            $senderType = 2; // 客服
        } else {
            $senderType = 1; // 客户
        }
        
        // 处理goods_id，如果是数组则取第一个元素
        $goodsId = $data['goods_id'] ?? 0;
        if (is_array($goodsId)) {
            $goodsId = !empty($goodsId) ? (int)reset($goodsId) : 0;
        } else {
            $goodsId = (int)$goodsId;
        }
        
        // 构建消息数据，使用已经处理过的值
        $messageData = [
            'client_uuid' => $clientUuid,
            'sender_type' => (int)$senderType,
            'admin_id' => (int)$adminId,
            'message' => $messageText, // 使用已经处理过的messageText
            'message_type' => (int)$messageType,
            'image_url' => $imageUrl, // 使用已经处理过的imageUrl
            'goods_id' => $goodsId
        ];
        
        $result = ChatModel::sendMessage($messageData);
        
        // 更新用户在线状态
        ChatModel::updateOnlineStatus(
            $clientUuid, // 使用已经处理过的clientUuid
            Request::ip(),
            Request::header('user-agent', '')
        );
        
        return json($result);
    }
    
    /**
     * 获取聊天记录（客户或客服）
     */
    public function getMessages()
    {
        $data = Request::post();
        $clientUuid = $data['client_uuid'] ?? '';
        
        if (empty($clientUuid)) {
            return json(['code' => 400, 'msg' => 'client_uuid不能为空']);
        }
        
        $page = $data['page'] ?? 1;
        $pageSize = $data['pageSize'] ?? 50;
        
        // 如果是客服请求，需要验证token
        $senderType = $data['sender_type'] ?? 1;
        if ($senderType == 2) {
            $admin = new Admin();
            $tokenResult = $admin->decodeToken();
            $tokenData = json_decode($tokenResult, true);
            
            if (!isset($tokenData['data']['adminId'])) {
                return json(['code' => 401, 'msg' => '未登录或登录已过期']);
            }
        }
        
        $result = ChatModel::getMessages($clientUuid, $page, $pageSize);
        
        // 标记消息为已读
        ChatModel::markAsRead($clientUuid, $senderType);
        
        return json($result);
    }
    
    /**
     * 获取未读消息数量
     */
    public function getUnreadCount()
    {
        $data = Request::post();
        $clientUuid = $data['client_uuid'] ?? '';
        
        if (empty($clientUuid)) {
            return json(['code' => 400, 'msg' => 'client_uuid不能为空']);
        }
        
        $senderType = $data['sender_type'] ?? 1; // 1-客户，2-客服
        
        // 如果是客服请求，需要验证token
        if ($senderType == 2) {
            $admin = new Admin();
            $tokenResult = $admin->decodeToken();
            $tokenData = json_decode($tokenResult, true);
            
            if (!isset($tokenData['data']['adminId'])) {
                return json(['code' => 401, 'msg' => '未登录或登录已过期']);
            }
        }
        
        $count = ChatModel::getUnreadCount($clientUuid, $senderType);
        
        return json([
            'code' => 200,
            'msg' => 'success',
            'data' => ['unread_count' => $count]
        ]);
    }
    
    /**
     * 获取在线用户列表（仅客服端）
     */
    public function getOnlineUsers()
    {
        // 验证token
        $admin = new Admin();
        $tokenResult = $admin->decodeToken();
        $tokenData = json_decode($tokenResult, true);
        
        if (!isset($tokenData['data']['adminId'])) {
            return json(['code' => 401, 'msg' => '未登录或登录已过期']);
        }
        
        $data = Request::post();
        // 确保 page 和 pageSize 是整数类型
        $page = isset($data['page']) ? (int)$data['page'] : 1;
        $pageSize = isset($data['pageSize']) ? (int)$data['pageSize'] : 20;
        
        // 限制 pageSize 的最大值，避免性能问题
        if ($pageSize > 100) {
            $pageSize = 100;
        }
        if ($pageSize < 1) {
            $pageSize = 20;
        }
        if ($page < 1) {
            $page = 1;
        }
        
        $result = ChatModel::getOnlineUsers($page, $pageSize);
        return json($result);
    }
    
    /**
     * 更新在线状态（客户端）
     */
    public function updateOnlineStatus()
    {
        $data = Request::post();
        $clientUuid = $data['client_uuid'] ?? '';
        
        if (empty($clientUuid)) {
            return json(['code' => 400, 'msg' => 'client_uuid不能为空']);
        }
        
        $ipAddress = Request::ip();
        $userAgent = Request::header('user-agent', '');
        
        ChatModel::updateOnlineStatus($clientUuid, $ipAddress, $userAgent);
        
        return json(['code' => 200, 'msg' => '更新成功']);
    }
    
    /**
     * 用户退出/离线通知
     * 支持JSON和FormData两种格式（因为sendBeacon可能使用FormData）
     */
    public function userOffline()
    {
        $clientUuid = '';
        
        // 方式1: 尝试从POST获取数据（支持FormData和application/x-www-form-urlencoded）
        $data = Request::post();
        if (!empty($data) && isset($data['client_uuid'])) {
            $clientUuid = (string)$data['client_uuid'];
        }
        
        // 方式2: 如果POST数据为空，尝试从原始输入流读取JSON数据
        if (empty($clientUuid)) {
            $input = file_get_contents('php://input');
            if (!empty($input)) {
                // 尝试解析JSON
                $jsonData = json_decode($input, true);
                if ($jsonData && isset($jsonData['client_uuid'])) {
                    $clientUuid = (string)$jsonData['client_uuid'];
                } else {
                    // 如果不是JSON，可能是URL编码的字符串
                    parse_str($input, $parsedData);
                    if (isset($parsedData['client_uuid'])) {
                        $clientUuid = (string)$parsedData['client_uuid'];
                    }
                }
            }
        }
        
        // 方式3: 从GET参数获取（备用方案）
        if (empty($clientUuid)) {
            $clientUuid = Request::get('client_uuid', '');
        }
        
        if (empty($clientUuid)) {
            return json(['code' => 400, 'msg' => 'client_uuid不能为空']);
        }
        
        // 将最后活跃时间设置为一个很早的时间，表示用户已离线
        // 设置为当前时间减去超时时间，这样在获取在线用户时就不会被查询到
        $offlineTime = time() - 600; // 设置为10分钟前，确保不会被查询为在线
        
        // 更新用户离线状态
        $result = Db::name('chat_online_users')
            ->where('client_uuid', $clientUuid)
            ->update(['last_active_time' => $offlineTime]);
        
        // 记录日志（可选，用于调试）
        // \think\facade\Log::info('用户离线通知', ['client_uuid' => $clientUuid, 'offline_time' => $offlineTime, 'result' => $result]);
        
        return json(['code' => 200, 'msg' => '用户已离线', 'data' => ['client_uuid' => $clientUuid]]);
    }
    
    /**
     * 标记消息为已读
     */
    public function markAsRead()
    {
        $data = Request::post();
        $clientUuid = $data['client_uuid'] ?? '';
        
        if (empty($clientUuid)) {
            return json(['code' => 400, 'msg' => 'client_uuid不能为空']);
        }
        
        $senderType = $data['sender_type'] ?? 1;
        
        // 如果是客服请求，需要验证token
        if ($senderType == 2) {
            $admin = new Admin();
            $tokenResult = $admin->decodeToken();
            $tokenData = json_decode($tokenResult, true);
            
            if (!isset($tokenData['data']['adminId'])) {
                return json(['code' => 401, 'msg' => '未登录或登录已过期']);
            }
        }
        
        $result = ChatModel::markAsRead($clientUuid, $senderType);
        return json($result);
    }
    
    /**
     * 上传聊天图片
     */
    public function uploadImage()
    {
        // 获取上传的文件
        $file = Request::file('image');
        if (is_null($file)) {
            return json(['code' => 400, 'msg' => '未找到上传文件']);
        }

        try {
            // 1. 验证文件类型和大小（使用validate函数，与Goods控制器保持一致）
            validate(['image' => [
                // 允许的文件后缀
                'fileExt' => 'jpg,png,jpeg,gif,webp',
                // 允许的文件大小（5MB）
                'fileSize' => 5 * 1024 * 1024,
            ]])->check(['image' => $file]);

            // 2. 定义上传目录（与Goods控制器保持一致）
            $uploadDir = public_path() . 'static/images/chat/';
            if (!is_dir($uploadDir)) {
                mkdir($uploadDir, 0755, true);
            }

            // 3. 生成唯一文件名
            $extension = $file->getOriginalExtension();
            $fileName = 'chat_' . time() . '_' . mt_rand(1000, 9999) . '.' . $extension;

            // 4. 移动文件到目标目录
            $file->move($uploadDir, $fileName);

            // 5. 生成可访问的图片路径（相对于网站根目录）
            $relativePath = '/static/images/chat/' . $fileName;

            return json([
                'code' => 200,
                'msg' => '上传成功',
                'data' => [
                    'image_url' => $relativePath,
                    'full_url' => Request::domain() . $relativePath
                ]
            ]);

        } catch (\think\exception\ValidateException $e) {
            // 文件验证失败（类型/大小不符）
            return json(['code' => 400, 'msg' => $e->getMessage()]);
        } catch (\Exception $e) {
            // 其他错误（如目录不可写）
            return json(['code' => 400, 'msg' => '上传失败：' . $e->getMessage()]);
        }
    }
}

